package com.hanserwei.mydemo.stream;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Vector;
import java.util.stream.Collector;
import java.util.stream.Stream;

public class parallelStreamTest2 {
    public static void main(String[] args) {
        List<Integer> collect = Stream.of(1, 2, 3, 4)
                .parallel()
                .collect(Collector.of(
                        () -> {
                            System.out.printf("%-12s %s%n", simple(), "create");
                            // 改用线程安全的容器
                            return new Vector<Integer>();
                        },// 1.如何创建容器
                        (list, x) -> {
                            List<Integer> old = new ArrayList<>(list);
                            list.add(x);
                            synchronized (list) {
                                System.out.printf("%-12s %s.add(%d)=>%s%n", simple(), old, x, list);
                            }
                        },// 2.如何向容器添加数据
                        (list1, list2) -> {
                            // 这里的这个容器只是为了调试的输出信息，实际并不参与流的工作
                            List<Integer> old = new ArrayList<>(list1);
                            list1.addAll(list2);
                            System.out.printf("%-12s %s.add(%s)=>%s%n", simple(), old, list2, list1);
                            return list1;
                        },// 3.如何合并两个容器的数据
                        list -> {
                            System.out.printf("%-12s finish: %s=>%s%n", simple(), list, list);
                            return Collections.unmodifiableList(list);
                        },// 4.收尾
                        // 5.特性：容器不支持并发，需要收尾，要保证收集顺序
                        Collector.Characteristics.IDENTITY_FINISH // 不需要收尾
                        , Collector.Characteristics.UNORDERED // 不需要排序
                        , Collector.Characteristics.CONCURRENT // 支持并发
                ));

        System.out.println(collect);
        collect.add(100);
        System.out.println(collect);
    }

    private static String simple() {
        String name = Thread.currentThread().getName();
        int idx = name.indexOf("worker");
        if (idx > 0) {
            return name.substring(idx);
        }
        return name;
    }
}
